2016-12-14 101 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 –