排队回调函数然后等待它们的执行

时间:2018-05-24 20:38:08

标签: javascript node.js asynchronous callback queue

我想创建一个将回调函数排入队列的函数,但是在该回调被出列并执行之前不会返回。

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

2 个答案:

答案 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函数。

Resolve Javascript Promise outside function scope