เพื่อดูว่าวัตถุที่ให้ไว้เป็นสัญญา ES6เราสามารถใช้ภาคแสดงนี้ได้หรือไม่:
function isPromise(p) {
return p && Object.prototype.toString.call(p) === "[object Promise]";
}
Call
ไอเอ็นจีtoString
โดยตรงจากObject.prototype
ผลตอบแทนที่เป็นตัวแทนสตริงพื้นเมืองของประเภทวัตถุที่กำหนดซึ่งเป็น"[object Promise]"
ในกรณีของเรา สิ่งนี้ทำให้มั่นใจได้ว่าวัตถุที่กำหนด
- ข้ามบวกเท็จเช่น .. :
- ประเภทวัตถุที่กำหนดเองที่มีชื่อตัวสร้างเดียวกัน ("สัญญา")
toString
วิธีการเขียนด้วยตนเองของวัตถุที่กำหนด
- สามารถทำงานได้ทั้งบริบทสภาพแวดล้อมหลาย ๆ (เช่น iframes) ในทางตรงกันข้ามกับ
instanceof
isPrototypeOf
หรือ
อย่างไรก็ตามวัตถุโฮสต์ใด ๆที่มีการแก้ไขแท็กผ่านSymbol.toStringTag
สามารถส่งคืน"[object Promise]"
ได้ นี่อาจเป็นผลลัพธ์ที่ตั้งใจหรือไม่ขึ้นอยู่กับโครงการ (เช่นหากมีการใช้งานสัญญาแบบกำหนดเอง)
เพื่อดูว่าวัตถุนั้นมาจากสัญญา ES6 แบบดั้งเดิมเราสามารถใช้:
function isNativePromise(p) {
return p && typeof p.constructor === "function"
&& Function.prototype.toString.call(p.constructor).replace(/\(.*\)/, "()")
=== Function.prototype.toString.call(/*native object*/Function)
.replace("Function", "Promise") // replacing Identifier
.replace(/\(.*\)/, "()"); // removing possible FormalParameterList
}
ตามนี้และส่วนนี้ของสเปคที่เป็นตัวแทนสตริงของฟังก์ชั่นที่ควรจะเป็น:
"ฟังก์ชั่นตัวระบุ (การเลือก FormalParameterList ) { FunctionBody }"
ซึ่งจัดการตามข้างต้น FunctionBodyเป็น[native code]
เบราว์เซอร์ที่สำคัญทั้งหมด
MDN: Function.prototype.toString
สิ่งนี้สามารถทำงานได้ในสภาพแวดล้อมที่หลากหลายเช่นกัน
.then
วิธีการได้ แต่นั่นจะไม่บอกคุณว่าสิ่งที่คุณมีคือสัญญาอย่างแน่นอน สิ่งที่คุณจะรู้ ณ จุดนั้นคือคุณมีสิ่งที่แสดง.then
วิธีการเช่นสัญญา