【问题标题】:function returns before API write completes函数在 API 写入完成之前返回
【发布时间】:2014-10-14 17:30:52
【问题描述】:

我有一个由 API PUT 调用组成的函数。当我点击函数调用更新时,问题是函数首先返回,然后请求写入 API,因此我得到的结果是未定义的。这个怎么解决

//update function call 
var result = update(object);
console.log('result ', result);




   function update(obj){

    var obj = obj;
    var err = '';
    var str = '';

    var options = {
        host: HOST,
        port: PORT,
        path: PATH + '/update/' + obj.id,
        headers: { "content-type": "application/json" },
        method: 'PUT'
    };


    try {
        var request = http.request(options, function (response) {
            response.on('data', function (chunk) {
                str += chunk;
            });

            response.on('end', function () {
                util.log('\nsaved.' + str);
            });

            response.on('error', function (e) {
                util.log('\nError while saving.' + e);
                err = 'Something went wrong. Please try again later.';
            });
        });

        var jsonObject = JSON.stringify(obj);

        util.log('\n Sent to Update ' + jsonObject);
        request.write(jsonObject);

        request.on('error', function (e) {
            util.log('\nError while updating request. ' + e);
            err = 'Something went wrong. Please try again later.';

        });

        request.end('end', function(e){
            util.log('On request end ' + str);
            return (str || {err : err});
        });

    } catch (err) {
        util.log("\nUpdating failed. " + err.stack);
        return ({err: 'Failed to update. Please try again.'});
    }
}

【问题讨论】:

  • Node.js 本质上是异步的,你不能期望像这样从 I/O 获得同步结果。您需要使用回调,为此您需要阅读一些教程。
  • 这是不了解异步响应是什么的人提出的数百个其他问题的重复。在stackoverflow.com/questions/14220321/…stackoverflow.com/q/23667086/218196 中有详细解释。 OP 需要从这两个答案开始阅读异步结果处理。答案将在回调或更现代的基于承诺的解决方案中。由于响应的延迟时间和调用的非阻塞性质,异步代码必须以不同的方式编写。

标签: javascript node.js express


【解决方案1】:

首先,您需要了解异步和非阻塞。当您的函数运行时,节点正在读取其他代码,并且在生成结果时它会返回该值,但现在您应该在控制台上显示您的答案的其他代码已经完成并将其打印为未定义。

您可以搜索节点中的回调和许多其他内容,首先您应该更好地了解您的工具:)

这是具有真实结构的代码:

update(object ,function(result){
    console.log('result :', result);    
});

function update(obj,callback){
   ...
   // removed : return (str || {err : err});
   callback (str || {err : err});

   ...
   // removed : return ({err: 'Failed to update. Please try again.'});
   callback ({err: 'Failed to update. Please try again.'});
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2014-07-10
    • 2020-09-26
    • 2015-02-17
    相关资源
    最近更新 更多