javascript - 在解决原始承诺之前等待嵌套的 JS 承诺完成
问题描述
我是 Promises 的新手,在解决原始 Promise 之前等待嵌套的 Promise 完成所有执行的概念有点麻烦。
原始代码
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
但我似乎无法真正了解这些信息,所以我希望有人可以帮助解释我的具体情况。
有帮助的帖子是:
解决方案
托马斯在标记的答案中解决了原始问题。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;
});
}
解决方案
首先,避免 Promise/Deferred 反模式。很少你需要创建自己的 Promise,通常你有一些返回 Promise 的函数;用那个。
其次,为了让外部 Promise 等待一个嵌套的 Promise,您需要将该嵌套的 Promise 返回到外部 Promise。
在内部返回一个 Promisethen()
将使生成的 Promise 解析为您在内部重新调整的 Promise 的值。
最后,类似.then(value => value)
or的东西.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;
}
});
}
推荐阅读
- java - 空字符串是否在 Java 中分配了内存?
- javascript - Insert items matching data attribute to ID's with jQuery
- vue.js - 即使从应用程序外部输入数据,也不会反映
- android - 为什么在这个自定义版本的 android 中有些 UI 按钮是可点击的,而另一些是不可点击的?
- intellij-idea - Intellij - 无法克隆存储库“克隆失败 - 无法访问 '<
> ':接收失败:连接已重置 - javascript - 如何有条件地渲染对话框 Material-ui
- python - 设置从 github 导入的库时遇到问题
- java - Eclipse 市场的 Spring 工具套件上没有 SQL 开发工具
- c++ - 类模板和友谊
- concurrent.futures - python Future 对象到底是什么?