我想创建一个将回调函数排入队列的函数,但是在该回调被出列并执行之前不会返回。
import * as FileSaver from 'file-saver';
public async DownloadRicetta(id: string, name: string): Promise<Blob> {
return new Promise<Blob>((resolve, reject) => {
const headers = new HttpHeaders();
headers.append('Accept', 'text/plain');
this._http.get(environment.API_URL + `endpoint`, { headers: headers, responseType: "blob", observe: 'response' })
.subscribe(response => {
try {
let blob = this.saveToFileSystem(response, name);
resolve(blob);
} catch (error) {
reject(error);
}
});
});
}
private saveToFileSystem(response, name: string): Blob {
const contentDispositionHeader: string = response.headers.get('Content-Disposition');
//for get original filename
const parts: string[] = contentDispositionHeader.split(';');
const filename = parts[1].trim().split('=')[1].trim();
//get extension of the file
const parts2: string[] = contentDispositionHeader.split('.');
let ext = parts2[1];
ext = ext.replace('"', '')
//set mimetype
const blob = new Blob([response.body], { type: 'YOURMIMETYPE'});
FileSaver.saveAs(blob, name + '_ricetta.' + ext);
return blob;
}
实际功能如下。当需要订单时,我们将检查是否有最近缓存的订单。如果我们没有最新版本,我们会将请求排队等待新订单。然后,我们将在请求后退回订单。实际代码看起来像这样:
function executeCallback(callback) {
if( shouldEnqueue ) {
enqueue(callback);
// awaits execution of callback
// return executed callback's return value
} else {
return callback()
}
}
答案 0 :(得分:0)
<强> 1。将回调转换为承诺
例如,转换
function mutilpy(a, b, callback) {
let result = a*b;
return callback(result);
}
到
function multiply(a, b) {
return new Promise(function(resolve, reject) {
let result = a*b;
resolve(result);
})
}
<强> 2。 (排序)将您的回调排入队列以完成
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = multiply(10,3);
Promise.all([promise1, promise2, promise3]).then(function(values) {
// YOU GET HERE WHEN ALL PROMISES ARE RESOLVED
console.log(values);
});
// expected output: Array [3, 42, 30]
答案 1 :(得分:0)
我找到了一个适合我的解决方案。可以从新的Promise中提取resolve函数,将resolve函数排入不同的范围,然后在任何范围内随时出现并执行resolve函数。