在承诺解决/拒绝后返回布尔值?

HIR*_*KUR 3 angularjs ionic-framework angular-promise ionic

我有一个非常好的功能.我只想根据承诺返回真或假.

 //I want this function to return a simple true or false!!!
function isAppOnline() {
            var is_connected = connectivityMonitor.isInternetConnected();
            is_connected.then(function(result) {
                console.log('INTERNET_CHECK_API : app online');//works fine
                return true;//this is not being returned
            }, function(error) {
                console.log('INTERNET_CHECK_API : app offline');//works fine
                return false;//this is not being returned
            });
        }
Run Code Online (Sandbox Code Playgroud)

但是当我调用这个函数时,

is_online = isAppOnline();
Run Code Online (Sandbox Code Playgroud)

is_online总是未定义的.为什么函数不能返回一个简单的布尔值?

更新:

这就是我想要做的:我只是想打开一个弹出窗口,通知用户他已离线.我在10secs之后定期调用函数isAppOnline.这个功能已经在我的工厂中使用了一个承诺.我不想让事情过于复杂,但对我来说重要的是这个函数返回一个布尔值,所以基于此,我可以相应地采取行动.

ste*_*425 6

编辑:对于ES2017如果您的幸运灵魂之一使用ES2017,那么您可以使用新的await/async关键字.它们非常出色,允许您编写读取同步的异步代码.(它仍然是引擎盖下的承诺,只是拆箱).

function isOnline() {
    return Promise.resolve(true);
}

async function Main() {
    const online = await isOnline();

  console.log(online);
}

Main();
Run Code Online (Sandbox Code Playgroud)

FIDLE


因为它是异步的.您的isAppOnline方法在您的承诺解决之前返回.

我假设正在进行某种形式的AJAX调用以检查网络连接,因此它必须等待它响应.JavaScript是单线程的,如果该线程被锁定等待该请求响应,那么它可以是同步的,整个JavaScript将暂停直到它返回.不好.

因此,如果您希望调用者isAppOnline知道您必须选择的结果.要么回传还是回复承诺(更好的选择)

function isAppOnline(cb) {
    var is_connected = connectivityMonitor.isInternetConnected();
    is_connected.then(function(result) {
        console.log('INTERNET_CHECK_API : app online');//works fine
        cb(true);
    }, function(error) {
        console.log('INTERNET_CHECK_API : app offline');//works fine
        cb(false);
    });
}

//better option
function isAppOnline() {
    return connectivityMonitor.isInternetConnected().then(function(result) {
        console.log('INTERNET_CHECK_API : app online');//works fine
        return true;
    }, function(error) {
        console.log('INTERNET_CHECK_API : app offline');//works fine
        return false;
    });
}

//used as
isAppOnline().then(function (isOnline) {
    console.log('Is it online?', isOnline);
});
Run Code Online (Sandbox Code Playgroud)

  • @Jayesh Jain注意在is_connected之前添加的返回 (2认同)

Dav*_*vic 0

你的问题表明我们非常需要进一步探索 Javascript 的异步处理。我建议阅读:如何从异步调用返回响应?

您可以实施一些技巧来强制方法同步返回,但 Angular 的构建方式几乎在任何地方都兑现承诺。如果您能为我们提供更多关于您想要完成的任务的背景信息,我们也许能够帮助您以利用承诺本身的方式编写代码。