如何等待异步调用完成单信号api

时间:2016-06-15 07:22:08

标签: asynchronous cross-domain onesignal window.parent

我正在使用One-signal API进行通知。我想从那里获得用户ID,下面是我的代码。

function setNotificationPermission()
{
    var id ;
    try
    {   
          OneSignal.push(["getUserId", function(userId) { 
          console.log("OneSignal User ID inside:"+ userId); 
            id = userId;
    }]); 
         console.log("OneSignal User ID outside:"+ id);
         window.parent.postMessage("Player ID"+id, "http://example.com");
    }
    catch(e){}
}  

我的答案如下

OneSignal User ID outside:
OneSignal User ID inside: f39fd4f1-406f-4c96-8365-5a471f77da3d

因为我调用一个信号的方法是异步的,所以我的window.parent.postMessage()方法在获得响应之前执行。请告诉我如何处理它?意味着如何等待我的OneSignal.push()完全调用

1 个答案:

答案 0 :(得分:1)

由于OneSignal的getUserId()以异步方式运行,因此您的setNotificationPermission()必须异步运行。这意味着setNotificationPermission()必须“等待”getUserId()完成才能回复。

OneSignal的getUserId()函数接受回调并返回Promise,因此您可以:

  • 选项1:postMessage()回调中调用getUserId() OneSignal.push(["getUserId", function(userId) { window.parent.postMessage(userId); });

  • 选项2 postMessage() Promise resolves时致电getUserId() OneSignal.push(function() { OneSignal.getUserId() .then(function(userId) { window.parent.postMessage(userId);
    }); });

第一种选择是最直接的。第一个选项在检索到用户ID后调用postMessage() ,回调到getUserId()