Javascript 在允诺中运行非允诺功能 我有三个基于承诺的函数,但是我需要在中间运行一个非承诺函数。 例如: 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);

Javascript 在允诺中运行非允诺功能 我有三个基于承诺的函数,但是我需要在中间运行一个非承诺函数。 例如: 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);,javascript,jquery,asynchronous,promise,Javascript,Jquery,Asynchronous,Promise,显然,我无法调用这样的非承诺函数,但我需要确保在运行updateListEMS之前,someNonPromiseFunc可以构建其对象并完全返回。您可以使用以下方法: getListItems('aList') .then(prepareSchemaData) .then(someNonPromiseFunc) // synchronous functions are allowed here .then(updateListItems); 你是怎么拥有它的

显然,我无法调用这样的非承诺函数,但我需要确保在运行
updateListEMS
之前,
someNonPromiseFunc
可以构建其对象并完全返回。

您可以使用以下方法:

getListItems('aList')
    .then(prepareSchemaData)
    .then(someNonPromiseFunc)       // synchronous functions are allowed here
    .then(updateListItems);
你是怎么拥有它的。同步的非承诺函数将作为单个参数(它可以使用或不使用)传递上一个
.then()
处理程序的解析值。下一个
.then()
处理程序将传递此同步函数的返回结果。这就行了

.then()
处理程序可以返回普通值或解析为值的承诺。两者都可以

因此,您可以将同步代码用作
.then()
处理程序。因为它是同步的,所以下一个
.then()
处理程序在这个处理程序返回之前不会被调用


在这种情况下,不需要像其他人建议的那样,将该同步函数包装在
Promise.resolve()
中。那将是不必要的代码。

“显然,我不能那样调用非承诺函数”-你怎么会这么想?你也可以编写
getListItems('List')。然后(prepareSchemaData)。然后(data=>updateListItems(someNonPromiseFunc(data))谢谢,我显然需要重温jquerypromise文档,以便更好地了解这一点!!!