2015-08-13 15 views
8

मुझे अपने कोड के साथ कुछ मदद चाहिए। मैं नोडज में नया हूं और इसमें बहुत परेशानी है।fs.writeFile एक वादे में, एसिंक्रोनस-सिंक्रोनस सामग्री

  • 1) अमेज़न उत्पादों के साथ एक .txt लाने (असिन की)
  • 2) amazon-product-api पैकेज

  • 3) प्रत्येक उत्पाद को बचाने के साथ सभी उत्पादों को लाने: क्या मुझे क्या करना कोशिश कर रहा हूँ एक .json फ़ाइल में

मेरा कोड काम नहीं कर रहा है। मुझे लगता है कि मैं इस एसिंक्रोनस-सिंक्रोनस सामान से गड़बड़ कर रहा हूं - मेरी मदद करो!

var amazon = require('amazon-product-api'); 
var fs = require('fs'); 

var client = amazon.createClient({ 
    awsId: "XXX", 
    awsSecret: "XXX", 
    awsTag: "888" 
}); 

var array = fs.readFileSync('./test.txt').toString().split('\n'); 
for (var i = 1; i < array.length; i++) { 
    var ASIN = array[i]; 

    return client.itemLookup({ 
      domain: 'webservices.amazon.de', 
      responseGroup: 'Large', 
      idType: 'ASIN', 
      itemId: ASIN 
     }) 
     .then(function(results) { 
      fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { 
       if (err) { 
        console.log(err); 
       } else { 
        console.log("JSON saved"); 
       } 
      }) 

      return results; 

     }).catch(function(err) { 
      console.log(err); 
     }); 
}; 

उत्तर

-1

लिए, एसिंक्रोनस परिवर्तित सभी कॉलबैक उपयोग करने के लिए उपयोग "Bluebird" जैसे कुछ पुस्तकालय वादा करने के लिए आसान। वादा (Bluebird) के साथ

 .then(function(results) { 
       fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { 
        if (err) { 
         console.log(err); 
        } else { 
         console.log("JSON saved"); 
         return results; 
        } 
       }) 


      }).catch(function(err) { 
       console.log(err); 
      }); 

कोशिश समाधान

var amazon = require('amazon-product-api'); 
var fs = require('fs'); 
var Promise = require('bluebird'); 

var client = amazon.createClient({ 
    awsId: "XXX", 
    awsSecret: "XXX", 
    awsTag: "888" 
}); 


var array = fs.readFileSync('./test.txt').toString().split('\n'); 
Promise.map(array, function (ASIN) { 
    client.itemLookup({ 
     domain: 'webservices.amazon.de', 
     responseGroup: 'Large', 
     idType: 'ASIN', 
     itemId: ASIN 
    }).then(function(results) { 
     fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { 
      if (err) { 
       console.log(err); 
      } else { 
       console.log("JSON saved"); 
       return results; 
      } 
     }) 
    }).catch(function(err) { 
     console.log(err); 
    }); 
}); 
5

अद्यतनSept 2017: fs-promisefs-extra के पक्ष में पदावनत किया गया है।


मैंने इसका उपयोग नहीं किया है, लेकिन आप fs-promise देख सकते हैं।

प्रॉक्सी सभी async FS तरीके के रूप में वादे/ए + संगत वादों (जब, क्यू, आदि) तथा उन्हें: यह एक नोड मॉड्यूल है। मूल्यों के माध्यम से सभी सिंक विधियों को पास करता है।

return new Promise(function(resolve, reject) { 
    fs.writeFile("<filename.type>", data, '<file-encoding>', function(err) { 
     if (err) reject(err); 
     else resolve(data); 
    }); 
}); 
अपने कोड क्या तुम करोगी में

तो: -

27

क्योंकि fs.writefile एक पारंपरिक अतुल्यकालिक कॉलबैक है आप वादा कल्पना का पालन करें और एक नया वादा एक संकल्प और इतने तरह अस्वीकृति हैंडलर के साथ यह लपेटकर वापस जाने के लिए की जरूरत है करने के लिए .then()

.then(function(results) { 
    return new Promise(function(resolve, reject) { 
      fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) { 
       if (err) reject(err); 
       else resolve(data); 
      }); 
    }); 
    }).then(function(results) { 
     console.log("results here: " + results) 
    }).catch(function(err) { 
     console.log("error here: " + err); 
    }); 
2

कहना

01 अपने कॉल के बाद तो सही तरह उपयोग

https://nodejs.org/api/util.html#util_util_promisify_original

इस कम ऊपर से मतदान जवाब से कीड़े की संभावना है

+2

'util.promisify' Node.js संस्करण 8. थॉट जोड़ा गया है यह जानकारी इसे प्रयोग के बारे में सोच रहे लोगों के लिए उपयोगी हो सकता है । – Tim

संबंधित मुद्दे