【问题标题】:Setting global variable in callback在回调中设置全局变量
【发布时间】:2016-07-11 14:30:25
【问题描述】:

试图简化我的代码以显示我的问题。

var rp = require('request-promise');
var ids = [];

runmyFunction();
runmyFunction();

function runmyFunction() {
    var id = 5;
    console.log("runmyFunc:  "+ids);
    if (ids.indexOf(id)==-1){
       myFunction(id);
    }
}

function myFunction(id) {
    var options = {
        uri: 'someURI'
        , headers: {
            'User-Agent': 'Request-Promise'
        }
        , json: true
    };
    rp(options)
        .then(function (response) {
            ids.push(5);
            console.log("myFunc: "+ids);
        })
        .catch(function (err) {
           console.log(err);
        });
}

基本上我有这个函数runmyFunction,如果其中没有id 12345,它应该只执行myFunction。因此,如果我运行它 10 次并且第 11 次返回 id 12345,它应该停止运行该函数。 问题是即使请求成功,id 也永远不会被推送到数组中。

类似的问题与异步请求有关。这也是我代码中的原因吗?

//edit 我玩弄了它并编辑了代码。当前代码将其记录到控制台中:

runmyFunc:  
runmyFunc:  
myFunc:5
myFunc:5,5

这是因为它是异步的。有什么想法可以避免这种情况吗?

【问题讨论】:

  • 由于 id 来自请求,因此您永远无法在实际获得请求 id 之前检查它们。您需要找到其他逻辑。
  • 抱歉,我没有明确表示我希望函数多次运行并在 id 在数组中时停止。我更正了。
  • 如果你是一个一个地调用 id,在每个 id 到达后运行检查。如果不是 12345,让 myFunction 再次触发。 PS:您是否检查过 id 是否真的在您收到的数据中?
  • 上面的代码是我真正问题的抽象。我得到一个带有随机 id 的 json 对象(是的,它在那里),并试图检查我是否没有使用这个 id 再次运行该函数。再次尝试使代码更清晰。
  • 完全删除runmyfunc函数并用function(response){ ids.push(response.data.id); if(ids.indexOf('12345') == -1) myFunction(); }替换'then'函数怎么样?如果你想在调用下一个之前创建一个同步流来检查每个id,你甚至不需要promise .是的,您当前的结果是正确的,因为您在第一次调用返回之前调用了 runmyfunc 两次。

标签: javascript node.js callback request


【解决方案1】:

不确定,但我认为您的问题将通过使用.bind() 来解决,也许有帮助:

var rp = require('request-promise');
var ids = [];


function runmyFunction() {
    if (ids.indexOf(12345)==-1){
   myFunction();
   }
}

function myFunction() {
    var options = {
    uri: 'someURI'
    , headers: {
        'User-Agent': 'Request-Promise'
    }
    , json: true
};
rp(options)
    .then(function (response,mids) {
        mids.push(response.data.id);
    }.bind(ids))
    .catch(function (err) {
       console.log(err);
    });
}

【讨论】:

  • 不知道你想在这里做什么,绑定改变了一个函数的范围(这个引用)。
  • @Shilly 我认为问题在于在“then”函数中我们超出了“this”的范围,所以我正在考虑将“ids”数组作为参数传递给它。这就是为什么我一开始说我不确定。
  • 这个 request-promise 库是否覆盖了标准的 function.bind() 方法?否则这根本没有意义,因为 this 上下文没有在 then 回调中使用。
【解决方案2】:

感谢@Shilly,我自己通过添加另一个数组找到了解决方案。

var rp = require('request-promise');

var ids = [];
var idstmp = [];

runmyFunction();
runmyFunction();

function runmyFunction() {
    var id = 5;
    if (ids.indexOf(id) == -1 && idstmp.indexOf(id) == -1) {
        console.log("I was here.");
        idstmp.push(id);
        myFunction(id);
    }
}

function myFunction(id) {
    var options = {
        uri: 'someURI'
        , headers: {
            'User-Agent': 'Request-Promise'
        }
        , json: true
    };
    rp(options)
        .then(function (response) {
            idstmp.splice(idstmp.indexOf(id), 1);
            ids.push(id);
            console.log("myFunc: " + ids);
        })
        .catch(function (err) {
        idstmp.splice(idstmp.indexOf(id), 1);
        });
}

这样做只是将请求当前“正在使用”的 id 添加到另一个数组中,以便在处理蜜蜂时被阻塞。这是一个很好的解决方法,但对我有用。

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 2018-10-10
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2019-07-18
    相关资源
    最近更新 更多