2016-12-14 103 views
1

我調用一個函數,如何有條件地等待承諾解決?

getResponse(Math.random()); 
doSomethingWith(someVar); 


getResponse(num) { 
    if(num > 0.8) someVar = "whee"; 
    if(num > 0.5) someVar = "whoo"; 
    if(num > 0) callSomeOtherFunctionWhichDoesABunchOfDatabaseQueriesThatUsePromisesAndEventuallySetssomeVar(); 
} 

有沒有一種方法,我可以等待callSomeOtherFunctionWhichDoesABunchOfDatabaseQueriesThatUsePromisesAndEventuallySetssomeVar()完成並設置someVar?我想我也可以將someVar的任務包裝在一個承諾中,然後使getResponsethen()成爲可能,但這似乎有點過分,因爲我只有一個例子,我有一堆異步工作正在完成以確定someVar

+5

承諾是病毒 - 一旦你開始使用usi將它放在你無法逃脫的地方(並且必須在任何地方使用它)。 – zerkms

+0

@zerkms可怕。 – ahota

+4

承諾承諾看起來有點苛刻,因爲如果它是基於回調的,情況也是如此。如果你關心等待異步事情完成,調用它的函數也需要異步。 – loganfsmyth

回答

4

注意,在下面的代碼替換callSomeOtherFunctionWhichDoesABunchOfDatabaseQueriesThatUsePromisesAndEventuallySetssomeVarsomeFunc:對

GETRESPONSE需要返回一個承諾,始終

所以

function getResponse(num) { 
    return Promise.resolve() 
    .then(() => { 
     if (num > 0.8) { 
      someVar = "whee"; 
      return; 
     } 
     if (num > 0.5) { 
      someVar = "whoo"; 
      return; 
     } 
     if (num > 0) { 
      return someFunc(); 
     } 
    }); 
} 

請注意 - 在邏輯您原始代碼將(幾乎)總是運行那個冗長的函數,因爲Math.random()幾乎總是> 0

的代碼的其餘部分將僅僅是

getResponse(Math.random()) 
.then(() => doSomethingWith(someVar)); 

如果someFunc解析爲它設置someVar來,你可以使代碼更好一點

var getResponse = num => Promise.resolve() 
.then(() => { 
    if (num > 0.8) { 
     return "whee"; 
    } 
    if (num > 0.5) { 
     return "whoo"; 
    } 
    return someFunc(); 
}); 

getResponse(Math.random()) 
.then(someValue => doSomethingWith(someValue)); 

但價值如果某些變量以其他方式使用,則可能沒有用

+0

amaziing沒有人注意到我忘記了'getResponse'頂部的'return':p –