同步Javascript;没有回调

时间:2013-04-25 19:15:57

标签: javascript jquery

我有一个适用于大多数浏览器的应用。不幸的是,对于Windows Phone 8上的Internet Explorer 10,我非常有限,我可以改变。有一些函数在WP IE10中不起作用 - 但我想通过劫持函数来解决这些问题,而不是重写任何代码。

var valueNeeded =  myFunction("settings")

// This function cannot have another param without me having to change lots of code
myFunction = function (field) {
    db.values('tblStorage', null, 10).done(function (results) {
        return (results[i].value);
    });
}

我遇到的问题是数据库调用没有阻塞/同步,因此返回不起作用。通常我会在回调中添加一个回调,但是因为我想为所有浏览器提供一个代码库,所以我真的不能这样做。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

异步函数要求整个callstack是异步的。

我会将你的代码重写为:

myFunction("settings").done(function (value) {
    console.log("value", value);
});

myFunction = function (field) {
    // v-- added return here                 v-- then here, so we return another promise (so we can call .done())
    return db.values('tblStorage', null, 10).then(function (results) {
        return (results[i].value);
    });
}

那么myFunction会返回什么?它返回一个承诺。承诺,当它被解决时,它将具有您请求的价值。

更确切地说:myFunction返回db.values(/**/).then()的值,这是一个承诺。 db.values(/**/)也会返回一个承诺。您可以堆叠promises并将它们链接在一起以获得一种异步管道和过滤器。

如果你解开这些功能,你会得到类似的东西:

myFunction = function (field) {
    var value_promise = db.values('tblStorage', null, 10);
    var filtered_value_promise = value_promise.then(function (results) {
        return (results[i].value);
    });
    return filtered_value_promise;
}