我有三个基于promise的函数,但我需要在中间运行一个非promise函数。 例如:
function getListItems(listTitle) {
var deferred = $.Deferred();
var ctx = SP.ClientContext.get_current();
var list = ctx.get_web().get_lists().getByTitle(listTitle);
var items = list.getItems(SP.CamlQuery.createAllItemsQuery());
ctx.load(items);
ctx.executeQueryAsync(
function () {
deferred.resolve(items);
},
function (sender, args) {
deferred.reject(sender, args);
}
);
return deferred.promise();
}
function prepareSchemaData(items) {
//promise
}
function someNonPromiseFunc() {
//returns some Object
}
function updateListItems(items) {
//updates items using data from the object returned by someNonPromiseFunc
//promise
}
getListItems('aList')
.then(prepareSchemaData)
.then(someNonPromiseFunc)
.then(updateListItems);
显然,我不能像这样调用非 promise 函数,但我需要确保在updateListItems
运行之前,someNonPromiseFunc
可以构建其对象并完全返回。
你可以用这个:
getListItems('aList')
.then(prepareSchemaData)
.then(someNonPromiseFunc) // synchronous functions are allowed here
.then(updateListItems);
只是你如何拥有它。 同步的非 promise 函数将前一个.then()
处理程序的解析值作为单个参数(它可以使用或不使用(传递。 下一个.then()
处理程序将传递此同步函数的返回结果。 这将正常工作。
.then()
处理程序可以返回纯值或解析为值的承诺。 两者都会起作用。
因此,您可以将同步代码用作.then()
处理程序。 由于它是同步的,因此在返回之前不会调用下一个.then()
处理程序。
对于这种情况,没有必要像其他人建议的那样将该同步函数包装在Promise.resolve()
中。 那只是不必要的代码。