Javascript 带承诺的递归函数
我有一个函数,它通过异步请求发送文件块(tmp是我的块) 只有当我的文件完全上传并使用时,我才想返回一个承诺:Javascript 带承诺的递归函数,javascript,ajax,recursion,promise,Javascript,Ajax,Recursion,Promise,我有一个函数,它通过异步请求发送文件块(tmp是我的块) 只有当我的文件完全上传并使用时,我才想返回一个承诺: this.uploadChunk(uploadId, content, 0).then(function (){ console.log("My file is uploaded"); .... // use my new file }) 我试图创建一个承诺,但一旦递归调用了我的函数,就不再定义resolve函数 需要帮助:)在承诺通知操作已完成的情况下,如何使用回调 upl
this.uploadChunk(uploadId, content, 0).then(function (){
console.log("My file is uploaded");
.... // use my new file
})
我试图创建一个承诺,但一旦递归调用了我的函数,就不再定义resolve函数
需要帮助:)在承诺通知操作已完成的情况下,如何使用回调
uploadChunk: function (uploadId, content, offset, callback) {
var tmp = content.slice(offset, offset + constants.ChunkSize);
restRequest({
method: 'POST',
url: 'file/chunk?uploadId=' + uploadId + '&offset=' + offset,
data: tmp,
processData: false,
contentType: false
}).then(function (resp) {
// When the upload is finished, we have an json object with a field '_modelType'
if (typeof resp._modelType === "undefined" || resp._modelType == null) {
return this.uploadChunk(uploadId, content, resp.received, callback);
}
// Here, file is fully upload
callback && callback(resp);
}.bind(this));
}
然后在此callbak中对操作事件做出反应
this.uploadChunk(uploadId, content, 0, function(resp) {
console.log("My file is uploaded");
.... // use my new file
});
因此,每次操作完成时都会通知您,即使您有递归
只有当我的文件完全上传并使用时,我才想返回一个承诺:
this.uploadChunk(uploadId, content, 0).then(function (){
console.log("My file is uploaded");
.... // use my new file
})
你的建议没有任何逻辑意义。承诺(以及通常的异步代码)的全部要点是它们不会立即完成。因此,即使您可以稍后返回某些内容,函数的原始调用方也将早已不在,无法接收您返回的值
幸运的是,你已经解决了98%的问题,只是没有意识到
您只需在此处添加单词return
return restRequest({
当有更多工作要做时,uploadChunk
方法的.then()
部分将返回一个承诺。这意味着您最初从uploadChunk
函数返回的承诺将继续等待,直到所有工作完成
试试看。只需添加return语句
return restRequest(…)
为什么要回调?为什么不归还OP已经做出的承诺?你很好。“为什么要回调?”-因为这里是递归,在一次调用中可以执行多次。“在一次调用中执行多次”和?您可以返回OnHandler的承诺。和OP一样。承诺是一元的。在这里使用回调就像在你的汽车上安装一个自行车轮子,因为你不知道如何更换爆胎。收回和承诺就像油和水一样。别把它们混在一起!