Asynchronous 如何在一个信号api中等待异步调用完成

Asynchronous 如何在一个信号api中等待异步调用完成,asynchronous,cross-domain,onesignal,window.parent,Asynchronous,Cross Domain,Onesignal,Window.parent,我正在使用一个信号API进行通知。我想从API中获取用户Id,下面是我的代码 function setNotificationPermission() { var id ; try { OneSignal.push(["getUserId", function(userId) { console.log("OneSignal User ID inside:"+ userId); id = userI

我正在使用一个信号API进行通知。我想从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){}
}  
我得到的答案如下

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()完全获取调用

因为OneSignal的操作是异步的,所以您的
setNotificationPermission()
也必须异步操作。这意味着
setNotificationPermission()
必须“等待”完成
getUserId()
,然后才能回复

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的
getUserId()
函数接受回调并返回一个值,因此您可以:

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){}
}  
  • 选项1:
    getUserId()回调中调用
    postMessage()
    
    OneSignal.push([“getUserId”,函数(userId){
    window.parent.postMessage(userId);
    });
    

  • 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){}
    }  
    
  • 选项2:调用
    postMessage()
    getUserId()调用时:
    
    
    OneSignal.push(函数(){
    OneSignal.getUserId()
    .then(函数(用户ID){
    window.parent.postMessage(userId);
    }); });

  • 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){}
    }  
    
第一个选项是最简单的。第一个选项在检索到用户ID后调用
postMessage()
,在调用
getUserId()

的回调中,因为OneSignal的操作是异步的,所以您的
setNotificationPermission()
还必须异步操作。这意味着
setNotificationPermission()
必须“等待”完成
getUserId()
,然后才能回复

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的
getUserId()
函数接受回调并返回一个值,因此您可以:

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){}
}  
  • 选项1:
    getUserId()回调中调用
    postMessage()
    
    OneSignal.push([“getUserId”,函数(userId){
    window.parent.postMessage(userId);
    });
    

  • 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){}
    }  
    
  • 选项2:调用
    postMessage()
    getUserId()调用时:
    
    
    OneSignal.push(函数(){
    OneSignal.getUserId()
    .then(函数(用户ID){
    window.parent.postMessage(userId);
    }); });

  • 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){}
    }  
    
第一个选项是最简单的。第一个选项在检索到用户ID后,在对
getUserId()
的回调中调用
postMessage()

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){}
}