具有promise的函数递归

时间:2018-06-22 08:25:06

标签: javascript ajax recursion promise

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

uploadChunk: function (uploadId, content, offset) {
  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);
    }
    // Here, file is fully upload
  }.bind(this));
}

仅当文件完全上传并使用时,我才想返回承诺:

this.uploadChunk(uploadId, content, 0).then(function (){
  console.log("My file is uploaded");
  .... // use my new file
})

我试图创建一个Promise,但是一旦递归调用了我的函数,就不再定义resolve函数。

需要帮助:)

2 个答案:

答案 0 :(得分:1)

  

仅当文件完全上传并使用时,我才想返回承诺:

您提出的建议没有任何逻辑意义。许诺(和一般而言,异步代码)的全部要点是它们不会立即完成。因此,即使您以后可以返回某些内容,该函数的原始调用方也将早已消失,并且无法接收您返回的值。

幸运的是,您已经有98%的方法可以解决此问题,而只是没有意识到。

您只需要在此处添加单词return

return restRequest({

.then()方法的uploadChunk部分在有更多工作要做时会返回一个承诺。这意味着您最初从uploadChunk函数返回的诺言将继续等待,直到完成所有工作。

只需尝试。

答案 1 :(得分:-1)

在答应通知操作已完成的情况下如何使用回调代替

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
});

因此,即使您有递归操作,每次操作完成时也会收到通知。