最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript Convert standard function to a promise - Stack Overflow

programmeradmin2浏览0评论

I have a standard function that successfully checks to see if a particular app is installed. But that function takes a few moments to execute and I need to bind it into a promise.then(function (response) { ...} because the app checker takes too long to execute...causing an async issue with the intended response from the app check function. But I can't get it work.

checkSocialApp only returns a true or false:

function checkSocialApp(objApp) {
  if (device.platform == "iOS") {
    var scheme =  objApp.ios;
  } else {
    var scheme =  objApp.and;
  }
  if (objApp.appName == "Facebook") {
    return true ;  // FB doesn't need app, can be logged in via browser
  } else {
    return appAvailability.check(
      scheme,
      function() {  // success callback
        console.log(scheme + " is Installed") ;
        return true ;
      }, function () {  // Error callback
        console.log(scheme + " is NOT Installed") ;
        alert("You do not have the " +objApp.appName+ " app installed.") ;
        return false ;
      }
    );
  }

  checkSocialApp(appObj).then(function(response){ // errors on 'then'
    if (response == true) {  // app IS installed
      console.log("CheckApp True") ;
      appObj.loginApp() ;
    } else if (response == false) {  // app IS NOT installed
      console.log("CheckApp False") ;
      appObj.disableApp() ;
    }
  }) ;

The above errors out on the .then. So I try to bind it to a promise.resolve:

var promise1 = Promise.resolve(checkSocialApp(appObj)) ;
promise1.then(function(response) {
   if (response == true) ...

This executes the checkSocialApp function successfully (as I see proper console messages printing from within that function), but I am not getting the response back into the remaining part of the .then for processing.

I have a standard function that successfully checks to see if a particular app is installed. But that function takes a few moments to execute and I need to bind it into a promise.then(function (response) { ...} because the app checker takes too long to execute...causing an async issue with the intended response from the app check function. But I can't get it work.

checkSocialApp only returns a true or false:

function checkSocialApp(objApp) {
  if (device.platform == "iOS") {
    var scheme =  objApp.ios;
  } else {
    var scheme =  objApp.and;
  }
  if (objApp.appName == "Facebook") {
    return true ;  // FB doesn't need app, can be logged in via browser
  } else {
    return appAvailability.check(
      scheme,
      function() {  // success callback
        console.log(scheme + " is Installed") ;
        return true ;
      }, function () {  // Error callback
        console.log(scheme + " is NOT Installed") ;
        alert("You do not have the " +objApp.appName+ " app installed.") ;
        return false ;
      }
    );
  }

  checkSocialApp(appObj).then(function(response){ // errors on 'then'
    if (response == true) {  // app IS installed
      console.log("CheckApp True") ;
      appObj.loginApp() ;
    } else if (response == false) {  // app IS NOT installed
      console.log("CheckApp False") ;
      appObj.disableApp() ;
    }
  }) ;

The above errors out on the .then. So I try to bind it to a promise.resolve:

var promise1 = Promise.resolve(checkSocialApp(appObj)) ;
promise1.then(function(response) {
   if (response == true) ...

This executes the checkSocialApp function successfully (as I see proper console messages printing from within that function), but I am not getting the response back into the remaining part of the .then for processing.

Share Improve this question edited Jan 26, 2018 at 21:05 rolinger asked Jan 26, 2018 at 20:50 rolingerrolinger 3,1061 gold badge38 silver badges69 bronze badges 4
  • 3 You will have to show us the code for checkSocialApp() before we can help. It needs to return a promise that is resolved with the appropriate value when the operation is done. .then() is a method of a promise object. So, your function needs to return a promise that is properly hooked up to your asynchronous operation. – jfriend00 Commented Jan 26, 2018 at 20:53
  • What is the code checkSocialApp() may be that function is not a promise thats why you get the error when you put .then – Jorge Mejia Commented Jan 26, 2018 at 21:00
  • I added the code for checkSocialApp(). Who is the guy running through down voting everyones responses...including my original post? Whats up with that? – rolinger Commented Jan 26, 2018 at 21:06
  • checkSocialApp would need to return a Promise, but it returns nothing - the return true and return false are in a different function. – Ben West Commented Jan 26, 2018 at 21:07
Add a ment  | 

3 Answers 3

Reset to default 3

You have to do something like this return a promise in your function:

function checkSocialApp(objApp) {
   return new Promise( function(resolve)={
         if (device.platform == "iOS") {
               var scheme =  objApp.ios;
           } else {
               var scheme =  objApp.and;
          }

          if (objApp.appName == "Facebook") {
                   resolve (true) ;  // FB doesn't need app, can be logged in via browser
          } else {
                 return appAvailability.check(
                       scheme,
                           function() {  // success callback
                                 console.log(scheme + " is Installed") ;
                                 resolve (true) ;
                            }, function () {  // Error callback
                                     console.log(scheme + " is NOT Installed") ;
                                     alert("You do not have the " +objApp.appName+ " app installed.") ;
                                  resolve (false) ;
                           }
                    );
        }
   })
}


  checkSocialApp(appObj).then(function(response){ // errors on 'then'
    if (response == true) {  // app IS installed
      console.log("CheckApp True") ;
      appObj.loginApp() ;
    } else if (response == false) {  // app IS NOT installed
      console.log("CheckApp False") ;
      appObj.disableApp() ;
    }
  }) ;

Does checkSocialApp usually take a callback? You can wrap it in a promise like this:

function checkSocialAppPromise ( appObj ) {
    return new Promise( function ( resolve ) {
        checkSocialApp( appObj, resolve )
    });
}

What you have should work, strictly speaking. If checkSocialApp(appObject) returns true or false, then you should get it. What you show works. If it isn't, then there must be something odd going on.

const someFunc = () => 5;

Promise.resolve(someFunc()).then(result => console.log(result));

However, it probably won't do what you are trying to do. You can't magically make a long-running synchronous function run async.

For example, if I have this function:

function runSlow() {
  const start = Date.now();
  while (Date.now() - start < 5000) { } // force a loop to wait 5 seconds
  return true;
}

runSlow();
console.log('done');

Which takes 5 seconds to plete. I can't just wrap it up and make it asynchrnous suddenly:

function runSlow() {
  const start = Date.now();
  while (Date.now() - start < 5000) { } // force a loop to wait 5 seconds
  return true;
}

Promise.resolve(runSlow())
  .then(response => console.log(response));

While technically it is wrapped in a promise, it still takes 5 seconds to run and it still blocks things (try clicking while it's running and you'll see your browser is unresponsive).

If you want it to run properly, you'll have to modify the function itself to stop being synchronous all together. There isn't any way to just wrap it up in it's own thread or anything.

发布评论

评论列表(0)

  1. 暂无评论