我有一个函数,可以通过异步请求发送文件块(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函数。
需要帮助:)
答案 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
});
因此,即使您有递归操作,每次操作完成时也会收到通知。