2014-10-02 48 views
0

我在與Vimeo的API接口的node.js中編寫一個小應用程序。我使用npm install vimeo-api從vimeo安裝了官方Node SDK。一切工作正常,但現在我想改變程序流程,使其更像「承諾」。例如,我希望我的程序在執行任何新代碼之前等待它收到Vimeo.accessToken方法返回的OAuth訪問令牌。我該如何實現這個目標?如何等待Vimeo.accessToken方法結束。想過使用Q?

下面是一些代碼驅動訪問令牌的檢索 - 非常從例子中所採取的SDK GitHub的頁面上:

var vmoapi = require('vimeo-api'), 
    vmo = new vmoapi(VMO_CLIENT_ID, VMO_CLIENT_SECRET); 
    . 
    . 
    . 

function getAccessToken(code, redirectURI){ 

    vmo.accessToken(code, redirectURI, function(err, token){ 

     if (err) { 
      console.log("Vimeo API Error\n" + err); 
      return; 
     } 

     if (token.access_token){ 

      console.log(nutil.inspect(token)); 
      vmo.access_token = token.access_token; 
      user = token.user; 
      userScopes = token.scope; 

      return token; 

     } 

    }) 
} 

在Node.js的我怎麼能這樣做以下:

getAccessToken(myCode, "http://someplace.com").done(function(data){ 
    console.log("Access token" + nutil.inspect(data)); 
}) 

我想也許我會使用Kris Kowal的Q庫,但我不確定如何去實現它,以便我的應用程序以我想要的方式流動。

回答

0

所以在閱讀Q的文檔和一些例子後,這裏是我實現的,它似乎工作!

var vmoapi = require('vimeo-api'), 
    vmo = new vmoapi(VMO_CLIENT_ID, VMO_CLIENT_SECRET), 
    . 
    . 
    . 
    deferred = Q.deferred(); 

. 
. 
. 

function getAccessToken(code, redirectURI) { 

     vmo.accessToken(code, redirectURI, function(err, token) { 

      if (err) { 
       console.log("Vimeo API Error\b" + err); 
       deferred.reject(new Error(err)); 
      } 

      if (token.access_token){ 
       vmo.access_token = token.access_token; 
       user = token.user; 
       userScopes = token.scope; 

       deferred.resolve(token); 
      } 
     }) 

     return deferred.promise; 
} 

getAccessToken(parsedURL.query.code, vmoRedirectURI) 
       .then(function(data){ 
         console.log("Vimeo access token:\n" + nutil.inspect(data)) 
       }); 

的解決方案涉及使用Q.deferred()對象,然後建立Vimeo.accessToken回調函數內的.reject.resolve方法。然後在調用Vimeo.accessToken方法的函數末尾返回deferred.promise