Javascript 带承诺的递归函数

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

我有一个函数,它通过异步请求发送文件块(tmp是我的块)

只有当我的文件完全上传并使用时,我才想返回一个承诺:

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一样。承诺是一元的。在这里使用回调就像在你的汽车上安装一个自行车轮子,因为你不知道如何更换爆胎。收回和承诺就像油和水一样。别把它们混在一起!