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.这个功能已经在我的工厂中使用了一个承诺.我不想让事情过于复杂,但对我来说重要的是这个函数返回一个布尔值,所以基于此,我可以相应地采取行动.
编辑:对于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)
因为它是异步的.您的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)
你的问题表明我们非常需要进一步探索 Javascript 的异步处理。我建议阅读:如何从异步调用返回响应?
您可以实施一些技巧来强制方法同步返回,但 Angular 的构建方式几乎在任何地方都兑现承诺。如果您能为我们提供更多关于您想要完成的任务的背景信息,我们也许能够帮助您以利用承诺本身的方式编写代码。