在回调中设置全局变量

时间:2016-07-11 14:30:26

标签: javascript node.js callback request

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

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也不会被推入数组中。

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

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

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

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

2 个答案:

答案 0 :(得分:0)

不确定,但我认为您的问题可以通过使用int values[] = { 2, 5, 1, 3, 4, 0, 6, 2, 5 }; quicksort(values, 0, 8, 2, &smaller); quicksort(values, 1, 7, 2, &bigger); 帮助来解决:

.bind()

答案 1 :(得分:0)

感谢@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'通过请求到另一个数组,所以它在使用时遇到阻塞。这是一个很好的解决方法,但对我有用。