我对Promises还是陌生的,在解决嵌套的诺言之前要等待嵌套的诺言完成所有执行,这一点让我有些麻烦。
原始代码
function getSomething(text) {
return new Promise(function (resolve, reject) {
getElse(text).then(function (items) {
if (items.length !== 0) {
/* Stuff here */
getElseElse(box).then(function (moreItems) {
/* Stuff here */
return array;
}.then(function (array) {
var promise = new Promise(function (resolve, reject) {
/* anotherFunction() is asynchronous */
result = anotherFunction(array); <-- Spot 1
});
promise.then(function () { });
});
return resolve(result); <--- Spot 2
}
else {
return resolve(null);
}
});
});
};
更新后的代码-更好,但仍无法完全按照我的意愿工作。
function getSomething(text) {
return getElse(text).then(function (items) {
if (items.length !== 0) {
/* Stuff here */
return getElseElse(box).then(function (moreItems) {
/* Stuff here */
return array;
}).then(anotherFunction);
} else {
return null;
}
});
}
然后,在各个“视图”页面中,我有这个:
getSomething(text).then(function (result) {
/* Do something here using result */
/* But result is undefined and I think still pending */
});
我已经在Thomas的帮助下优化了原始功能,但是在拟定result
之前,视图内的原始调用似乎仍在继续。
我希望getSomething()
完成并返回result
,然后再在视图内的.then
内部执行代码。到目前为止,这还没有实现。
我发现有几篇文章指出了我认为Promise.all
正确的方向,但是我似乎并不能从中获得任何信息,所以我希望有人可以为您解释我的具体情况。
帮助的帖子是:
托马斯(Thomas)在标记的答案中解决了原始问题。经过进一步检查,最终问题已在anotherFunction()
内部解决。
最初:
function anotherFunction(array) {
return new Promise(function (resolve, reject) {
return anotherGet(parcels).then(function (list) {
/* Do stuff here without a return */
});
});
}
固定版本:
function anotherFunction(array) {
return anotherGet(parcels).then(function (list) {
/* Do stuff here */
return list;
});
}
答案 0 :(得分:4)
首先,避免使用Promise / Deferred反模式。很少需要创建自己的Promise,通常您有一些返回Promise的函数;用那个。
第二,要让外部Promise等待嵌套的PRomise,您需要将嵌套的Promise返回到外部Promise。
在then()
内部返回一个Promise将使最终的Promise解析为您在其中重新调整的Promise的值。
最后,类似.then(value => value)
或.then(value => Promise.resolve(someFunction(value)))
的东西毫无意义。 anotherFunction
周围的包装器基本上只是通过了参数并返回了结果。
因此,您的伪代码应如下所示:
function getSomething(text) {
return getElse(text).then(function (items) {
if (items.length !== 0) {
/* Stuff here */
return getElseElse(box).then(function (moreItems) {
/* Stuff here */
return array;
}).then(anotherFunction);
} else {
return null;
}
});
}
答案 1 :(得分:1)
基本技巧是确保所有{
"result": { "#ifcondition(#valueof($.values.date),condition,#valueof($.values.value),fail)" }
}
调用都在嵌套的promise的resolve()
方法内。
类似的东西:
then()
如果需要嵌套在上面的function getSomething(text) {
return new Promise(function (resolve, reject) {
getElse(text).then(function (items) {
if (items.length !== 0) {
/* Stuff here */
getElseElse(box).then(function (moreItems) {
/* Stuff here */
return array;
}.then(function (array) {
var promise = new Promise(function (resolve, reject) {
result = anotherFunction(array); <-- Spot 1
});
promise.then(function () { });
resolve(result); <--- Spot 2
});
}
else {
resolve(null);
}
});
});
};
中,只需将其粘贴在其中即可。
还请注意,您无需返回您的解决方案。只需打电话给他们。