2016-09-29 17 views
-3

私はループバックとjsforceで約束を学び始めましたが、この問題を処理できませんでした。私はcb()関数に約束した状態varを返すことができませんでした。 基本的に私はsalesforceに接続してJSforce経由でデータを取得し、ループバック経由でdbに書きたいと思っています。次に、リモートモチェットが呼び出された後、作成/更新/エラーレコードをクライアントに戻したいとします。私は約束の中でステータスを返すことができますか?

私はExpress.js のNode.js &を使用して経由でループバックして開発しています私はそれをどのように修正することができますSalesforceの

を接続するためにJSforceライブラリを使用していますか?

は、ここに私のコードです:

module.exports = function(Contact) { 
    var jsforce = require('jsforce'); 
    var async = require("async"); 
    var lr = require('lr.js'); 

    Contact.ImportContacts = function(cb) { 
    // Salesforce Projects List 
    var sf_projects = []; 
    //Salesforce Conn String 
    var conn = lr.SalesforceConn(); 
    conn.apex.get("/Contact/", function(err, res) { 
     var status = { 
     "Created": [], 
     "Updated": [], 
     "Error": "" 
     }; 
     if (err) console.log(err); 

     sf_projects = res; 
     // Clear result 
     status.Created.length = 0; 
     status.Updated.length = 0; 
     status.Error = ""; 

     if (sf_projects != undefined) { 
     async.eachSeries(sf_projects, function(contact, callback) { 
      Contact.findOrCreate({ 
       where: { 
       co_SalesforceID: contact.Id 
       } 
      }, { 
       co_Name: contact.FirstName, 
       co_Surname: contact.LastName, 
       co_Salutation: contact.Salutation, 
       co_Title: contact.Title, 
       co_Department: contact.Department, 
       co_Email: contact.Email, 
       co_PhonePersonal: contact.HomePhone, 
       co_PhoneWork: contact.Phone, 
       co_PhoneCell: contact.MobilePhone, 
       co_Description: contact.Description, 
       co_SalesforceID: contact.Id 
      }, 
      function(err, cntct, created) { 
       if (err) console.log(err); 
       if (created) { 
       status.Created.push(cntct.id); 
       console.log("Contact created. SalesForeID: " + 
        cntct.co_SalesforceID + 
        " ContactName: " + 
        lr.isDefined(cntct.co_Salutation) + " " + 
        lr.isDefined(cntct.co_Name) + " " + 
        lr.isDefined(cntct.co_Surname)); 
       } else { 
       Contact.replaceById(cntct.id, { 
        co_Name: contact.FirstName, 
        co_Surname: contact.LastName, 
        co_Salutation: contact.Salutation, 
        co_Title: contact.Title, 
        co_Department: contact.Department, 
        co_Email: contact.Email, 
        co_PhonePersonal: contact.HomePhone, 
        co_PhoneWork: contact.Phone, 
        co_PhoneCell: contact.MobilePhone, 
        co_Description: contact.Description, 
        co_SalesforceID: contact.Id 
        }, 
        false, 
        function(err, obj) { 
        if (err) console.log(err); 
        status.Updated.push(obj.id); 
        console.log("Contact updated. SalesForeID: " + 
         obj.co_SalesforceID + " ContactName: " + 
         lr.isDefined(obj.co_Salutation) + " " + 
         lr.isDefined(obj.co_Name) + " " + 
         lr.isDefined(obj.co_Surname)); 
        }); 
       } 
      }); 
      callback(err); 
     }, function(err) { 
      if (err) console.error(err); 
     }); 
     } else { 
     console.log("Salesforce Connection Error!"); 
     status.Error = "Salesforce Connection Error"; 
     } 
     return Promise.resolve(status); 
    }).then(function(end) { 
     cb(null, end); 

    }).catch(function(err) { 
     if (err) console.log(err); 
    }); 
    }; 
    Contact.remoteMethod(
    'ImportContacts', { 
     returns: { 
     arg: 'result', 
     type: 'string' 
     }, 
     http: { 
     path: '/importContacts', 
     verb: 'get' 
     } 
    } 
); 
}; 
+0

あなたは場所を正確にテキストのこの壁の中から何を返すようにしたいですか? – deceze

+0

私はconn.apex.get()の内部から状態変数を返して、それをcb()関数に渡したいと思います – canerce

+0

solve({status:status、callback:cb}) ; して、そのブロック内のその: .then(関数(エンド){ end.callback(ヌル、end.status); }) – 1337

答えて

1

それは約求めているものを完全に明らかではない、とあなたはここで重要であるかもしれないあなたのsolve()機能が含まれていませんので、私はあなたにいくつかの一般的なヒントを与えることができます。

あなたはこのようなものを持っている:

}).then(function(end) { 
    cb(null, end); 
}).catch(function(err) { 
    if (err) console.log(err); 
}); 

最初の部分(thencb()コールバックは、ノードのコールバックの通常の慣習以下、第一引数と第二引数として値としてエラーを取ることを示唆しています。

しかし、2番目の部分(catch)では、エラーが発生したコールバックは呼び出されません。また、catchハンドラでは、solve()関数がfalseまたはnullを拒否理由として指定して拒否された約束を返さない限り、常にエラーが発生するため、拒否理由が何であれコールバックは常にエラーの場合に呼び出される:

}).then(function(end) { 
    cb(null, end); 
}).catch(function(err) { 
    console.log(err); 
    cb(err); 
}); 

このようにして、コールバックが呼び出されずに永遠に待機するような状況は発生しません。あなたが伝統的なコールバックと約束を混ぜ合わせるときには、いくつかのことを念頭に置いておく必要があります:

コールバックを引数として受け取る関数は、このコールバックが呼び出され、これを確実にする関数作成者としてのあなたの責任です。あなたが実行しなければならないエラーの場合:

callback(error); 

、あなたが呼び出す必要があり、成功の場合:操作が終了しているかどうか、それはで終了したとき

callback(null, data); 

その方法、callbackを知ることができます

function (err, data) { 
    if (err) { 
    console.log('Error:', err); 
    } else { 
    console.log('Success:', data); 
    } 
} 

コールバックを取る機能の全体の呼び出しは、通常は次のとおりです:

最初の引数をテストして成功したか失敗しましたか一方
functionTakingCallback('some', 'arguments', function (err, data) { 
    if (err) { 
    console.log('Error:', err); 
    } else { 
    console.log('Success:', data); 
    } 
}); 

関数は約束を返す場合、あなたはこのようにそれを使用します。

functionReturningPromise('some', 'arguments') 
.then(function (data) { 
    console.log('Success:', data); 
}) 
.catch(function (err) { 
    console.log('Error:', err); 
}); 

この場合にはerrをテストする必要はありません。

コールバックは常に1回だけ呼び出す必要があります。約束は常に最終的に解決されるか拒絶されるべきです。使用方法が異なり、呼び出し元と呼び出し先の両方の責任が異なります。伝統的なノードスタイルのコールバック関数と約束を返す関数の2つのスタイルを混在させる場合、それらの違いに注意する必要があります。

Bluebirdやそのpromisify()promisifyAll()などのライブラリを使用して約束を返す関数に、コードベース全体の非同期関数すべてに対して一貫したAPIを使用するようにコールバック関数を変換することがあります。参照:

あなたは、私がコールバックと約束し、どのように役立つかもしれないこれは、より詳細に一緒にそれらを使用するとの違いを説明し、いくつかの他の回答を見ることができますこの場合:

+0

こんにちは@rspエラー制御とコールバックの使用法について感謝します。私は不足しているコードを追加しました。それについては、ごめんなさい。 solve => Promise.resolve コードを変更して今すぐ試してみましょう – canerce

関連する問題