बहुत सारे डुप्लिकेट कोड लिखने के प्रयास में मैं कॉल खोलने की कोशिश नहीं कर रहा हूं। मैं अधिमानतः केवल शीर्ष स्तर से आसपास के कार्यों को पारित करना चाहता हूं। इस प्रकार सं.बिना खोलने के वादे लिखने के बाद
function ensureLink(srcPath, dstPath){
dstPath = fsRedux.predictDir(srcPath, dstPath)
var dstDir = path.dirname(dstPath)
return fsRedux.exists(dstPath)
.then(_.partialRight(fsRedux.ifFalseThrow, false, new Error(dstPath+" exists cannot ensure link")))
.then(_.bind(fsExtra.mkdirsAsync, fsExtra, dstDir))
.then(_.bind(_.bind(fsExtra.linkAsync, fsExtra, srcPath, dstPath)))
}
हालांकि उपरोक्त कोड काम नहीं करता है। नीचे दिया गया परीक्षण दिखाता है कि आप bound
promisifyAll
async फ़ंक्शन पास नहीं कर सकते हैं। इसका कारण यह है कि तत्कालीन मूल्य इन वादों में पारित किया जाता है जो उन्हें कॉल में अगली तर्क के रूप में कार्य करने का कारण बनता है, इन कार्यों के लिए इसका मतलब है कि वे कॉलबैक के रूप में आग लगते हैं, यही कारण है कि पहली टेस्ट त्रुटि Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
के साथ मोचा में है।
var chai = require("chai")
var chaiAsPromised = require("chai-as-promised")
chai.use(chaiAsPromised)
chai.should()
var path = require("path")
var _ = require("lodash")
var mock = require("mock-fs")
var Promise = require("bluebird")
var fsRedux = require("./fs-redux")
var fsExtra = Promise.promisifyAll(require("fs-extra"))
var fs = Promise.promisifyAll(require("fs"))
mock({
'path/hello-alpha.txt': 'file content here',
'path/hello-beta.txt': 'file content here'
})
var dstPath = "path/to/fake/dir/"
function closedThen(srcPath, dstPath){
dstPath = fsRedux.predictDir(srcPath, dstPath)
var dstDir = path.dirname(dstPath)
return fsRedux.exists(dstPath)
.then(_.partialRight(fsRedux.ifFalseThrow, false, new Error(dstPath+" exists cannot ensure link")))
.then(_.bind(fsExtra.mkdirsAsync, fsExtra, dstDir))
.then(_.bind(_.bind(fsExtra.linkAsync, fsExtra, srcPath, dstPath)))
}
function openThen(srcPath, dstPath){
dstPath = fsRedux.predictDir(srcPath, dstPath)
var dstDir = path.dirname(dstPath)
return fsRedux.exists(dstPath)
.then(_.partialRight(fsRedux.ifFalseThrow, false, new Error(dstPath+" exists cannot ensure link")))
.then(function(){
return _.bind(fsExtra.mkdirsAsync, fsExtra, dstDir)()
})
.then(function(){
return _.bind(fsExtra.linkAsync, fsExtra, srcPath, dstPath)()
})
}
describe("issue", function(){
describe("closedThen()", function(){
it("should return then and run promise", function(){
return closedThen("path/hello-alpha.txt", dstPath).then(function(){
return fsExtra.readFileAsync("path/to/fake/dir/hello-alpha.txt", "utf8").should.eventually.equal("file content here")
})
})
})
describe("openThen()", function(){
it("should return then and run promise", function(){
return openThen("path/hello-beta.txt", dstPath).then(function(){
return fsExtra.readFileAsync("path/to/fake/dir/hello-beta.txt", "utf8").should.eventually.equal("file content here")
})
})
})
})
क्या कार्य मौजूद हैं, या बाध्य कार्य को लपेटने का तरीका वादे के साथ काम करने की अनुमति देगा?
अद्यतन:
मैं समारोह रैपर (lodash उनमें से एक गुच्छा है) कि एक then
या चलाने के लिए पारित करने के लिए partialing या binding from my question earlier या रैपिंग कार्यों के लिए एक आसान इंटरफेस के लिए अनुमति देने के सुइट का एक पुस्तकालय के लिए देख रहा हूँ Promise.reduce
के भीतर। इस तरह चेनिंग वादे वास्तव में आसान हैं।
आदर्श रूप से मैं सिर्फ यह जानना चाहता हूं कि लाइन को कैसे काम करना है, इसे लपेटने का एक तरीका ताकि जब से इसका परिणाम पारित हो जाए तो यह अनदेखा हो जाता है। या एक अनुशंसित विकल्प।
.then(_.bind(fsExtra.mkdirsAsync, fsExtra, dstDir))
वास्तव में यह समझना मुश्किल है कि आप क्या पूछ रहे हैं - क्या आप आगे स्पष्टीकरण दे सकते हैं। एक प्रोमोसिफाइड फ़ंक्शन (परिभाषा द्वारा कुछ हद तक) एक वादा देता है और अब कॉलबैक का उपयोग नहीं करता है। यदि आप इसे कॉल करते हैं, तो यह एक वादा वापस कर देगा जो केवल तभी हल किया जाता है जब अंतर्निहित एसिंक ऑपरेशन किया जाता है। इसके अतिरिक्त, यदि आप सीरियल ऑपरेशन चाहते हैं, समानांतर ऑपरेशन नहीं, तो आपको 'फ़ंक्शन' हैंडलर के फ़ंक्शन संदर्भ को पास करने की आवश्यकता है, न कि कुछ फ़ंक्शन निष्पादित करने का रिटर्न वैल्यू (जब तक कि रिटर्न वैल्यू स्वयं एक फ़ंक्शन नहीं है आप अनुक्रम में बुलाया जाना चाहते हैं)। – jfriend00
हां, संपादन ने समस्या को समझने में बहुत मदद नहीं की।मिश्रित विभिन्न समस्याओं का एक गुच्छा विवरण है। मैं कम से कम देखता हूं 1. यूनिट टेस्ट ठीक से नहीं बनाया गया है और इसके परिणामस्वरूप एक समय समाप्त हो गया है (असफल दावा नहीं) 2. गलत तरीके से काम करता है कि कैसे 'बाइंड' काम करता है। वास्तव में उदाहरण के लिए आखिरी 'फिर' हैंडलर '_.bind (fsExtra.linkAsync ... 'श्रृंखला में पिछले वादे का परिणाम प्राप्त करता है। लेकिन' fsExtra.linkAsync' इसे तीसरे पैरामीटर के रूप में प्राप्त करता है (' dstPath' के बाद) –
मैं अभी भी डॉन करता हूं अनुवर्ती नहीं हो सकता है। हो सकता है कि आप बस बैक अप ले सकें और उन विशिष्ट संचालनों का वर्णन कर सकें जिन्हें आप स्क्रिप्ट करना चाहते हैं और फिर पूछें कि इसे लिखने का सबसे प्रभावी तरीका कैसा है? ऐसा लगता है कि आप किसी प्रकार का सामान्य प्रश्न पूछने की कोशिश कर रहे हैं, लेकिन उपयोग कर रहे हैं समस्या का वर्णन करने के लिए बहुत से मुद्दों के साथ कोड का वास्तव में एक जटिल सेट है और आप हमें उस जटिलता में खो रहे हैं। क्या आप समस्या को एक बहुत ही सरल उदाहरण में कम कर सकते हैं? – jfriend00