【发布时间】:2017-04-03 06:56:34
【问题描述】:
我在数组中有一些数据。
let data = ['firstData', 'secondData'];
第一个对象(firstData)始终存在,secondData 可以为空。所以我总是用它来调用我的异步函数,比如:
myAsyncFunction(data[0]).then(result => {
//do something here
});
如果data[1] 存在,我想用data[1] 调用myAsyncFunction。
我目前的解决方案是嵌套承诺。像这样:
myAsyncFunction(data[0]).then(result => {
return result;
}).then(result => {
if(data[1] !== null){
myAsyncFunction(data[1].then(resultTwo => {
//dostuff with data
});
}
});
我不是很喜欢这个解决方案,但它确实有效。这一定是一个更好的方法。 result 始终是一个对象。我试过Promise.all,但它不起作用。我认为这是某种“竞争条件”的问题(我在这里如履薄冰)。
我目前的解决方案是唯一的吗?
这是 myAsuncFunction 的样子:
myAsyncFunction(personData){
return new Promise<any> ((resolve, reject) => {
//Assingen private variables
secondAsyncFunction(somePersonData).then(result =>
{
//Do some sync stuff
return someNewData; //not a promise
})
.then(thirdAsyncFunction)
.then(data => {
resolve(data);
})
.catch(error => {
reject(error);
});
});
【问题讨论】:
-
所以我有几个问题...您的 if 语句正在检查它是否不等于 null...这是否意味着您的数组可能是 data = ["firstData", null]?此外,您可能想尝试使用 Promise.map 做一些事情。 bluebirdjs.com/docs/api/promise.map.html
-
嗨!正确,data[1] 有时可能为空。我没有使用蓝鸟,我使用的是 ES6 承诺。我认为有区别(?)。
-
如果您只是想知道它们何时全部完成,并且它们可能为空,您可以像这样从数据数组创建一个映射......让 data_promises = data. map(function(data){ return data ? myAsyncFunction(data) : Promise.resolve(); });然后调用 Promise.all(data_promises);。这几乎可以检查值是否存在(null 当然是错误的),并且会创建一个 Promise,如果它是 null 则立即解析
-
如果您可以分享您尝试
Promise.all时的错误消息或代码,我们将不胜感激。如果存在竞争条件,这是否意味着第一个承诺必须在第二个承诺开始之前完成? -
我没有收到任何错误消息。但是我在 Promise.all 中得到了两个对象。问题是两个对象都基于来自第二个对象(data[1])的数据。
标签: javascript node.js asynchronous es6-promise