将回调数据分配给变量

MrP*_*lot 3 javascript

我一直试图弄清楚如何将值从回调设置为变量,以便我可以调用变量并访问数据,而不必将所有代码放在回调函数中.我发布了两个有效的示例,第二个有效,返回undefined.我怎样才能使第二个例子有效?

这是我获取数据的地方.

var chromeApi = {
    msg: function (callbacks) {
        chrome.runtime.sendMessage({type: "settings"}, callbacks);
    }
};
Run Code Online (Sandbox Code Playgroud)

当我从chromeApi这种方式访问数据时它工作正常.

chromeApi.msg(function (response) {
    console.log(response);
});
Run Code Online (Sandbox Code Playgroud)

但我想以这种方式访问​​它我未定义.如何使我的代码能够使用此方法?

var test = chromeApi.msg(function (response) {
    return response;
});
console.log(test);
Run Code Online (Sandbox Code Playgroud)

sfl*_*che 9

欢迎来到异步编程的世界.:)

如果你想分配responsetestCAN异步回调中这样做:

chromeApi.msg(function (response) {
    test = response;
});
console.log(test);
Run Code Online (Sandbox Code Playgroud)

但是 ......因为回调是异步的(意味着我们不知道该赋值语句何时会实际执行)我们不知道是否

test = response;
Run Code Online (Sandbox Code Playgroud)

之前执行

console.log(test)
Run Code Online (Sandbox Code Playgroud)

直到运行时.

我从上面的代码猜测console.log(test)将会在之前执行test = response(但是,由于异步编程表现出非确定性行为,因此每次都不会发生相同的执行顺序).

根据您对响应值的要求,将决定是否需要在回调中完成.

这保证有效

chromeApi.msg(function (response) {
    test = response;
    // do something with test
});
Run Code Online (Sandbox Code Playgroud)

这不是

chromeApi.msg(function (response) {
    test = response;
});
//do something with test 
Run Code Online (Sandbox Code Playgroud)