2015-08-23 13 views
6

पर नई फ़ंक्शन कॉल जोड़ने का वादा करें, मैं फ़ाइल लोड करने और पार्स करने का प्रयास कर रहा हूं, लेकिन मुझे दो कार्यों को कॉल करने और वादे के परिणाम को वापस करने में कुछ परेशानी हो रही है। मैं ब्लूबर्ड वादे का उपयोग कर रहा हूँ।श्रृंखला

run = function (filePath) { 
    return Promise.join(
     fs.readFileAsync(filePath, 'utf8') 
      .then(parseFile.parse.bind(null, 'userKey')), 
     users.getUsersAsync(usersObj) 
      .then(users.modifyRec.bind(null, process.env.users)) 
    ).then(function (args) { 
      return runProc('run', args[0], args[1]); 
.... 

मैं दो तरीकों, parseFile.parse और parseFile.getProp में parseFile.parse समारोह बांट दिया है: निम्नलिखित कोड अपेक्षित ढंग से काम करता है। parseFile.getProp को parseFile.parse से आउटपुट लेना चाहिए और विधि को विभाजित करने से पहले parseFile.parse वापस लौटा देना चाहिए। यहां दोनों कार्यों का उपयोग करने का मेरा प्रयास है:

run = function (filePath) { 
    return Promise.join(
     fs.readFileAsync(filePath, 'utf8') 
      .then(parseFile.parse.bind(null, 'userKey')) 
      .then(parseFile.getProp.bind(null,'key')), 
     users.getUsersAsync(usersObj) 
      .then(users.modifyRec.bind(null, process.env.users)) 
    ).then(function (args) { 
      return runProc('run', args[0], args[1]); 
.... 

लेकिन यह काम नहीं कर रहा है। मुझसे यहां क्या गलत हो रहा है?

अद्यतन

var ymlParser = require('yamljs'); 
var ymlObj; 

parse = function (data) { 
    "use strict"; 
    if (!ymlObj) { 
     ymlObj = ymlParser.parse(data); 
    } 
    return ymlObj; 
}; 

getProcWeb = function() { 
    return ymlObj.prop.web; 
}; 

module.exports = { 
    parse: parse, 
    getProp: getProp 
}; 
+2

क्या काम नहीं कर रहा उपयोग करना चाहिए? क्या आपको कोई त्रुटि मिल रही है, या क्या 'तर्क' का अप्रत्याशित मूल्य है? –

+0

@ChrisHunt - समस्या यह है कि गेटप्रॉप को पार्स फ़ंक्शन से पहले बुलाया जाता है, इससे समस्या उत्पन्न होती है ... –

+0

क्या 'पार्स' सिंक्रोनस है, या क्या यह एक वादा वापस करता है जो उचित मूल्य को हल करता है? क्या आप अपना 'पार्सफ़ाइल' कोड प्रदान कर सकते हैं? बस 'Promise.resolve()। (Function() {console.log ("1");}) के साथ त्वरित परीक्षण कर रहा है। फिर (function() {console.log ("2");}) ; 'दिखाता है कि पहला फ़ंक्शन दूसरे से पहले चलाना चाहिए, इसलिए यह वादा स्वयं स्वयं को कोई समस्या नहीं दे सकता है। –

उत्तर

1

Promise.join एक सरणी वापस आ जाएगी नहीं, आपके मामले में - args []। Promise.all एक सरणी वापस कर देगा।

अपने मामले में

तो, आप या तो

Promise.join(
     fs.readFileAsync(filePath, 'utf8') 
      .then(parseFile.parse.bind(null, 'userKey')) 
      .then(parseFile.getProp.bind(null,'key')), 
     users.getUsersAsync(usersObj) 
      .then(users.modifyRec.bind(null, process.env.users)) 
     ,function(argsOne,argsTwo){ 
      return runProc('run', argsOne, argsTwo); 
    })); 

करने के लिए अपने Promise.join वाक्य रचना को बदलने या Promise.all

Promise.all([promise1, promise2]).then(function(args){ 
     return runProc('run', args[0], args[1]); 
    }); 
संबंधित मुद्दे