2016-02-02 110 views
1

我有一个使用Cordova和AgularJS的移动应用程序,它将消息发送到API。我只支持HTML5浏览器。从JavaScript(或Angular JS)排队API消息

API调用不需要是即时的,它可能会在某个时间后发生。所以,如果网络停机/缓慢或API关闭,那很好,但重要的是,呼叫将在某个阶段发生。除了收到消息之外,不需要对客户端进行反馈。

是否有任何库(纯JavaScript或Angular JS)这样做?说打电话给图书馆,图书馆会在某个阶段对信息进行排队并交付,或者在设定的时间之后再次尝试,直到信息被发送为止。

如果没有现成的图书馆,那么您是否有任何如何实现这一目标的最佳实践?

N.B.如果浏览器重新启动,消息应该仍然在队列中(因此内存存储可能不合适)

回答

1

好的,如果它只是关于链接请求并将它们放置在某个对象的某处,那么可以使用angularJS的$ q服务:

https://docs.angularjs.org/api/ng/service/ $ q

你也可以连接这些承诺,一个漂亮的how-to(旧...): http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/

如果你也与angularJS位置服务工作,甚至可以在应用程序加载之前解析所有这些数据,但是我想这不是要求。

+0

我添加了一个笔记,我想支持重新启动浏览器,我不确定这是否重新启动浏览器后,这是否工作? – Adam

+1

如果你需要一个状态,你可以将这个例子与本地存储结合起来 – nhaa123

1

您可以使用bluebird.js来实现所需的功能。例如。

function a(params) { 
    let p = return new Promise(resolve, reject) { 
     yourLibraryThatCallsYourAPI(params, result => { 
      // Resolves when ever your API sends reply. 
      resolve(result); 
     }, error => { 
      reject(new Error(error)); 
     }); 
    } 

    // After 5 seconds, try again. 
    p.timeout(5000).then(result => { 
     console.info(result); 
    }) 
    .catch(e => { 
     console.error(e.message); 

     return a(params); 
    }); 

    return p; 
} 

... 

a(); 

+0

这是一个持久存储(就像在localStorage或WebSQL中一样)?因为我正在寻找一个永久的(好的,半永久的),以防应用程序重新启动。 – Adam

+0

如果你需要一个状态,你可以将这个例子与本地存储结合起来 – nhaa123