gpt4 book ai didi

javascript - 等待 Node 中的回调完成

转载 作者:行者123 更新时间:2023-12-03 05:41:05 24 4
gpt4 key购买 nike

我正在使用 Elasticsearch JS 客户端和 Node 来学习 ES 和 Javascript。我在 SublimeText2 中使用像这样定义的 Javascript 构建系统来运行 JS 代码:

{
"cmd": ["C:\\Program Files\\nodejs\\node.exe", "$file"],
"selector": "source.js"
}

这样写是为了将数据提交到ES进行索引:

"use strict";

const es = require('elasticsearch');
const path = require('path');
const fs = require('fs');

function es_connect(url, loglevel) {
if (typeof loglevel === 'undefined') { // somehow default function params feature from ES6 is not available in installable node/js
loglevel == 'error';
}
return new es.Client({host: url, log:loglevel});
}

function get_content(fname) {
const raw = fs.readFileSync(path.join('data', fname));
const content = JSON.parse(raw);
console.log('Found ' + content.objects.length + ' objects.');
return content;
}

function index_json_list(fname, index, doc_type, url) {
var content = get_content(fname);
var client = es_connect(url);
var results = [];

function result_cb(err, resp) {
console.log('Pushing error ' + err + ' and response ');
console.log(resp);
results.push({error:err, response:resp});
};

content.objects.forEach(function(x) {
console.log('___Submitting ');
console.log(x);
client.index({
index: index,
type: doc_type,
body: x
},
result_cb);
});

results.forEach(function(x){
console.log('indexing result: ' + x);
})

console.log('results');
console.log(results);
}


index_json_list('us_presidents.json', 'officials', 'president', 'http://localhost:9200/');

数据来源:https://github.com/dariusk/corpora/blob/master/data/humans/us_presidents.json

输出:

Found 66 objects.
___Submitting
{ website: '',
startdate: '2009-01-20',
role_type_label: 'President',
....
leadership_title: null }

results
[]

Pushing error undefined and response
{ _index: 'officials',
_type: 'president',
_id: 'AVhOXERCNHzrCLGOfUu1',
_version: 1,
result: 'created',
_shards: { total: 2, successful: 1, failed: 0 },
created: true }
Pushing error undefined and response
{ _index: 'officials',
_type: 'president',
_id: 'AVhOXERBNHzrCLGOfUu0',
_version: 1,
result: 'created',
_shards: { total: 2, successful: 1, failed: 0 },
created: true }
...

问题:

  1. 很明显为什么打印结果会输出空数组,但问题是我如何等待这些回调完成? (我的意思不是同步等待,而是以异步回调方式等待)。它可能可以使用 Promise 来完成,但我还没有学习 Promise,现在想学习如何执行这种“回调”方式。

  2. 是否有某种方法可以在 JSON 对象上进行字符串连接,而不是获得像 [object Object] 这样的表示,而是使用对象文字? (如果我调用console.log(obj),我会得到对象文字的字符串表示形式,而不是这个[object Object]“简写”)。使用 .toString() 是不好的。

最佳答案

  1. async提供异步原语/工作流 API,用于使用基于回调的方法处理异步请求。 async提供了几乎1对1的方式performing集合上的异步操作。

    他们的模型是每个操作都会传递一个回调。当操作完成(成功或错误)时,该操作将调用回调。异步允许您注册一个回调,以便在所有操作完成时执行。

您可以通过跟踪需要执行的异步操作数量以及这些操作何时完成来推出自己的异步操作。

var numOps = content.objects.length;

然后在回调中您可以检查这是否是最后一个要执行的回调。

function result_cb(err, resp) {
results.push({error:err, response:resp});
if (results.length === numOps) {
// all operations have succeeded! `results` is completed
}
}

如果你查看async源代码,他们会做类似的事情来维护异步状态。

  • 您可以创建自定义格式化程序函数,也可以使用内置标准库函数记录对象:https://stackoverflow.com/a/10729284/594589
  • 关于javascript - 等待 Node 中的回调完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40528790/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com