Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodejs异步/等待嵌套API进度_Node.js_Promise_Async Await_Hapijs - Fatal编程技术网

Node.js nodejs异步/等待嵌套API进度

Node.js nodejs异步/等待嵌套API进度,node.js,promise,async-await,hapijs,Node.js,Promise,Async Await,Hapijs,我有一个API,它搜索用户提供的术语,返回一个结果数组,然后为每个结果发出异步请求,并为每个第二批请求获取结果。我希望API能够报告进展情况,而不仅仅是最终结果。因此,如果我执行以下请求,我应该像这样获得更新 $ curl 'http://server/?q=foobar' searching for ${q}… found 76… now getting images… found 30 images… done { result } 大部分相关代码如下所示。Fwiw,我正在为我的应

我有一个API,它搜索用户提供的术语,返回一个结果数组,然后为每个结果发出异步请求,并为每个第二批请求获取结果。我希望API能够报告进展情况,而不仅仅是最终结果。因此,如果我执行以下请求,我应该像这样获得更新

$ curl 'http://server/?q=foobar'
searching for ${q}…
found 76… now getting images…
found 30 images… done
{
    result
}
大部分相关代码如下所示。Fwiw,我正在为我的应用程序使用
hapijs

let imagesOfRecords = {};

const getImages = async function (q) {

    console.log(`searching for ${q}…`);
    const uri = `http://remoteserver/?q=${q}`;
    const {res, payload} =  await Wreck.get(uri);
    const result = JSON.parse(payload.toString()).hits;
    const numOfFoundRecords = result.total;

    if (result.total) {

        console.log(`found ${result.total}… now getting images…`);
        const foundRecords = result.hits.map(getBuckets);
        Promise.all(foundRecords).then(function() {

            console.log(`found ${Object.keys(imagesOfRecords).length} images… done`);
            reply(imagesOfRecords).headers = res.headers;
        }).catch(error => { 
            console.log(error)
        });
    }
    else {
        console.log('nothing found');
        reply(0).headers = res.headers;
    }
};

const getBuckets = async function(record) {

    const { res, payload } = await Wreck.get(record.links.self);
    const bucket = JSON.parse(payload.toString()).links.bucket;
    await getImageFiles(bucket, record.links.self);
};

const getImageFiles = async function(uri, record) {

    const { res, payload } = await Wreck.get(uri);
    const contents = JSON.parse(payload.toString()).contents;
    imagesOfRecords[record] = contents.map(function(el) {
        return el.links.self; 
    });
};

一旦我可以实现这一点,我的下一个任务将是在使用上述API的web应用程序中实现此渐进式更新。

要显示后端请求的每个步骤的结果,您可以使用
EventEmitter
,它将在每个进度步骤上发出事件。您可以阅读有关活动的信息。
简单实现:

const events = require('events');
const eventEmitter = new events.EventEmitter();

//your request code
Promise.all(foundRecords).then(function() {
  console.log(`found ${Object.keys(imagesOfRecords).length} images… done`);
  eventEmitter.emit('progress');
  reply(imagesOfRecords).headers = res.headers;
})

const eventReaction = (e) => {
  // do something with event, console log for example.
}
eventEmitter.on('progress', eventReaction);
更多的例子,你可以找到和。
要向客户端显示事件,可以使用库。我认为您可以找到关于socket.io如何工作的非常简单的解释。

如果您想在服务器或进程之间发送事件,并想进一步了解,您可以阅读更多有关0MQ(零mq)及其节点的信息

这很好,谢谢。我会尝试一下这些建议。虽然,现在有些事情告诉我,这可能比值得的麻烦多了,因为我还必须给API的使用者一些区分进度更新和结果的方法。有很多东西可以做实验。