gpt4 book ai didi

javascript - 在解决内部 promise 之前, promise 链会继续

转载 作者:行者123 更新时间:2023-11-30 12:15:46 25 4
gpt4 key购买 nike

Promise resolve before inner promise resolved 类似的问题但我仍然无法让它工作。

每次我认为我理解了 promise ,我证明自己错了!

我有这样写的函数

function getFileBinaryData () {
var promise = new RSVP.Promise(function(resolve, reject){
var executorBody = {
url: rootSite + sourceRelativeUrl + "/_api/web/GetFileByServerRelativeUrl('" + fileUrl + "')/$value",
method: "GET",
binaryStringResponseBody: true,
success: function (fileData) {
resolve(fileData.body);
},
error: function (argument) {

alert("could not get file binary body")
}
}
sourceExecutor.executeAsync(executorBody);
});
return promise;
}

function copyFileAction (fileBinaryData) {
var promise = new RSVP.Promise(function(resolve, reject){
var executorBody = {
url: rootSite + targetWebRelativeUrl + "/_api/web/GetFolderByServerRelativeUrl('" + targetList + "')/Files/Add(url='" + fileName + "." + fileExt + "', overwrite=true)",
method: "POST",
headers: {
"Accept": "application/json; odata=verbose"
},
contentType: "application/json;odata=verbose",
binaryStringRequestBody: true,
body: fileBinaryData,
success: function (copyFileData) {
resolve();
},
error: function (sender, args) {

}
}
targetExecutor.executeAsync(executorBody);
});
return promise;
}

我尝试这样链接

$.getScript("/_layouts/15/SP.RequestExecutor.js")
.then(patchRequestExecutor)
.then(function(){
sourceExecutor = new SP.RequestExecutor(sourceFullUrl);
targetExecutor = new SP.RequestExecutor(targetList);
})
.then(getFileInformation)
.then(getFileBinaryData)
.then(copyFileAction)
.then(getTargetListItem)
.then(updateTargetListItem)
.catch(function (sender, args) {

});

或者像这样

$.getScript("/_layouts/15/SP.RequestExecutor.js")
.then(patchRequestExecutor)
.then(function(){
sourceExecutor = new SP.RequestExecutor(sourceFullUrl);
targetExecutor = new SP.RequestExecutor(targetList);
})
.then(function(){
return getFileInformation();
})
.then(function(){
return getFileBinaryData();
})
.then(function(binaryData){
return copyFileAction(binaryData)
})
.then(function(){
return getTargetListItem();
})
.then(function(listItem){
return updateTargetListItem(listItem);
});

但问题是,即使我返回新的 promise,执行也会在任何内部 promise 得到解决之前继续沿着链进行。怎么会?难道不应该等到异步请求成功并在success 回调中调用resolve() 吗?

最佳答案

你在这里没有做错任何事。这是 jQuery 的错,as so often 1.

问题是 jQuery 不是 Promises/A+兼容(直到 v 3.0),并且无法从除它自己的实现之外的其他实现中采用 promises/thenable。因此,当您的回调确实返回 RSVP promise 时,jQuery 只是将它们视为要实现的值,而不是等待它们。
可以将您所有的 promise 转换到 jQuery deferred 并且它会起作用,但您真的不希望那样。要使标准的 Promise 行为(由 RSVP 提供)起作用,您需要避免 jQuery 的错误 then。这can easily be done :

RSVP.Promise.resolve($.getScript("/_layouts/15/SP.RequestExecutor.js"))
// ^^^^^^^^^^^^^^^
.then(patchRequestExecutor)
.then(function(){
sourceExecutor = new SP.RequestExecutor(sourceFullUrl);
targetExecutor = new SP.RequestExecutor(targetList);
})
.then(getFileInformation)
.then(getFileBinaryData)
.then(copyFileAction)

关于javascript - 在解决内部 promise 之前, promise 链会继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32475978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com